import os
import re
import sys

from fpdf import FPDF
from PIL import Image

from img_converter import convert_img, has_img_files


def get_images(subfolder, extensions=None):
    """获取指定文件夹中的所有图片文件，并按文件名排序

    Args:
        subfolder (str): 目标文件夹
        extensions (list, optional): 允许的图片扩展名. 默认支持常见图片格式。

    Returns:
        list: 排序后的图片文件完整路径列表
    """
    if extensions is None:
        extensions = {'.jpg', '.jpeg', '.png', '.bmp', '.gif', '.tiff'}

    images = []
    for root, _, files in os.walk(subfolder):
        for file in files:
            if any(file.lower().endswith(ext) for ext in extensions):
                images.append(os.path.join(root, file))

    # 使用数字感知排序
    return sorted(images, key=custom_sort)


def custom_sort(s):
    """数字感知的排序函数（如果需要按数字排序）

    Args:
        s (str): 文件路径

    Returns:
        int: 排序用的数字
    """
    # 使用 os.path.basename 确保跨平台一致性
    filename = os.path.basename(s)
    if "-" in filename:
        filename = filename.split("-")[-1]

    # 提取所有数字并组合
    numbers = re.findall(r'\d+', filename)
    if numbers:
        # 如果有多个数字，组合成一个数字
        return int(''.join(numbers))
    return 0


def images_to_pdf(folder_path):
    """批量图片转pdf

    Args:
        folder_path (_type_): _description_
    """
    print(f"\n开始处理目录: {folder_path}")
    subfolders = [f.path for f in os.scandir(folder_path) if f.is_dir()]
    total_folders = len(subfolders)

    if total_folders == 0:
        print("未找到子文件夹，请检查目录结构")
        return

    print(f"共发现 {total_folders} 个子文件夹待处理")

    for index, subfolder in enumerate(subfolders, 1):
        try:
            print(
                f"\n[{index}/{total_folders}] 处理文件夹: "
                f"{os.path.basename(subfolder)}")

            psf_file = os.path.join(
                folder_path, os.path.basename(subfolder) + '.pdf')
            # 跳过已存在的
            if os.path.exists(psf_file):
                print(f"-> 跳过: PDF 文件已存在 ({os.path.basename(psf_file)})")
                continue

            # 检查并转换 webp 文件
            if has_img_files(subfolder, '.webp'):
                print("-> 开始转换 webp 文件...")
                converted = convert_img(subfolder, '.webp')
                if converted:
                    print("   webp 文件转换完成")
                else:
                    print("   webp 文件转换过程中存在错误，请检查详细日志")

            # 检查并转换 png 文件
            if has_img_files(subfolder, '.png'):
                print("-> 开始转换 png 文件...")
                converted = convert_img(subfolder, '.png')
                if converted:
                    print("   png 文件转换完成")
                else:
                    print("   png 文件转换过程中存在错误，请检查详细日志")

            pdf = FPDF()
            images = get_images(subfolder)
            total_images = len(images)

            if total_images > 0:
                print(f"-> 开始生成 PDF，共 {total_images} 张图片")
                for img_index, image in enumerate(images, 1):
                    try:
                        # 获取图片原始尺寸
                        img = Image.open(image)
                        original_width, original_height = img.size

                        # 计算缩放比例
                        width_ratio = 210 / original_width
                        height_ratio = 297 / original_height
                        scale_ratio = min(width_ratio, height_ratio)

                        # 设置图片尺寸
                        original_width = original_width * scale_ratio
                        original_height = original_height * scale_ratio

                        # 计算页面中心坐标
                        x_center = (210 - original_width) / 2
                        y_center = (297 - original_height) / 2

                        # 装载图片
                        pdf.add_page()

                        # 设置背景色为黑色
                        pdf.set_fill_color(0, 0, 0)
                        pdf.rect(0, 0, pdf.w, pdf.h, 'F')

                        # 调整页面大小适应 A4
                        pdf.image(image, x_center, y_center,
                                  original_width, original_height)
                        print(
                            f"   处理图片 [{img_index}/{total_images}]: "
                            f"{os.path.basename(image)}")
                    except Exception as e:
                        print(
                            f"   !! 图片处理失败 [{img_index}/{total_images}]: "
                            f"{os.path.basename(image)}")
                        print(f"   !! 错误信息: {e}")

                build_pdf(pdf, subfolder)
                print(f"-> PDF 生成成功: {os.path.basename(subfolder)}.pdf")
            else:
                print("!! 未找到可用的图片文件")

        except Exception as e:
            print(f"!! 文件夹处理失败: {os.path.basename(subfolder)}")
            print(f"!! 错误信息: {e}")

    print(f"\n任务完成! 共处理 {total_folders} 个文件夹")


def build_pdf(pdf, subfolder):
    pdf.output(os.path.join(
        folder_path, os.path.basename(subfolder) + '.pdf'))

    print(f"PDF:{os.path.basename(subfolder) + '.pdf'}生成完成")


if __name__ == "__main__":
    folder_path = input("请输入目标目录路径: ").strip()
    if not os.path.exists(folder_path):
        print("输入的目录路径不存在，请检查后重试")
    else:
        images_to_pdf(folder_path)
        print("PDF: 全部生成完成")
